//
//  Stack.c
//  栈
//
//  Created by Yan Zihao on 2024/10/23.
//
#include "Stack.h"

void StackInit(Stack* ps)
{
    assert(ps);
    ps->_a = NULL;
    ps->_capacity = 0;
    ps->_top = 0;
}
// 入栈
void StackPush(Stack* ps, STDataType data)
{
    assert(ps);
    if(ps->_top == ps->_capacity)
    {
        int newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
        STDataType* tmp = (STDataType*)realloc(ps->_a,sizeof(STDataType)*newcapacity);
        if(tmp == NULL)
        {
            perror("realloc fail");
            return;
        }
        ps->_a[ps->_top] = data;
        ps->_top++;
    }
}
// 出栈
void StackPop(Stack* ps)
{
    assert(ps);
    assert(ps->_top > 0);
    ps->_top--;
}
// 获取栈顶元素
STDataType StackTop(Stack* ps)
{
    assert(ps);
    assert(ps->_top > 0);
    return ps->_a[ps->_top - 1];
}
// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
    assert(ps);
    return ps->_top;
}
// 检测栈是否为空，如果为空返回非零结果，如果不为空返回0
int StackEmpty(Stack* ps)
{
    assert(ps);
    return ps->_top == 0;
}
// 销毁栈
void StackDestroy(Stack* ps)
{
    assert(pst);

    free(pst->a);
    pst->a = NULL;
    pst->top = pst->capacity = 0;
}
